package ch10
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Rectangle;

	import utils.Ball;

	/**
	 * 角度反弹,动态效果 ,实时地改变 line 的角度;使用getBounds判断line边界
	 * @author sjp
	 *
	 */
	public class AngleBounceBounds extends Sprite
	{
		private var ball:Ball;
		private var line:Sprite;
		private var gravity:Number=0.3;
		private var bounce:Number=-0.6;

		public function AngleBounceBounds()
		{
			init();
		}

		private function init():void
		{
			ball=new Ball();
			addChild(ball);
			ball.x=100;
			ball.y=100;

			line=new Sprite();
			line.graphics.lineStyle(1);
			line.graphics.lineTo(300, 0);
			addChild(line);
			line.x=50;
			line.y=200;
			line.rotation=30;

			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			line.rotation=(stage.stageWidth / 2 - mouseX) * .1;

			// normal motion code
			ball.vy+=gravity;
			ball.x+=ball.vx;
			ball.y+=ball.vy;

			/**使用getBounds判断边界*/
			var bounds:Rectangle=line.getBounds(this);
			trace(bounds.left);
			trace(bounds.right);
			trace(bounds.top);
			trace(bounds.bottom);
			trace("\n");
			if (ball.x > bounds.left && ball.x < bounds.right)
			{

				// get angle, sine and cosine
				var angle:Number=line.rotation * Math.PI / 180;
				var cos:Number=Math.cos(angle);
				var sin:Number=Math.sin(angle);

				// get position of ball, relative to line
				var x1:Number=ball.x - line.x;
				var y1:Number=ball.y - line.y;

				// rotate coordinates
				var y2:Number=cos * y1 - sin * x1;

				// perform bounce with rotated values
				if (y2 > -ball.height / 2)
				{
					// rotate coordinates
					var x2:Number=cos * x1 + sin * y1;

					// rotate velocity
					var vx1:Number=cos * ball.vx + sin * ball.vy;
					var vy1:Number=cos * ball.vy - sin * ball.vx;

					y2=-ball.height / 2;
					vy1*=bounce;

					// rotate everything back;
					x1=cos * x2 - sin * y2;
					y1=cos * y2 + sin * x2;
					ball.vx=cos * vx1 - sin * vy1;
					ball.vy=cos * vy1 + sin * vx1;
					ball.x=line.x + x1;
					ball.y=line.y + y1;
				}
			}
		}
	}
}